#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Cache:
    """
    Cette classe représente le cache du proxy.
    Elle bufferise toutes les requêtes passant par celui-ci.
    """

    def __init__(self):
        """ 
        Constructeur.
        Initialise le buffer.
        """

        self.pages = []

    def add(self, method, hname, path, date, data):
        """
        Cette fonction permet d'ajouter une requête et son résultat dans 
        le cache.
        Elle prend en paramètre la méthode, le nom de domaine de l'hôte à
        contacter, le chemin du fichier dans l'arborescence du serveur,
        l'instant auquel la requête a été effectuée et le résultat de la
        requête.
        """
        print "Résultat de", method, hname + path, "ajouté en cache.\n"
        tpl = [method, hname, path, date, data]
        self.pages.append(tpl)

    def find(self, method, hname, path):
        """
        Cette fonction permet de chercher une requête dans le cache.
        Elle prend en paramètre la méthode, le nom de domaine de l'hôte
        à contacter et le chemin du fichier dans l'arborescence du serveur.
        Elle retourne True si la requête est en cache, False sinon.
        """

        for elem in self.pages:
            a = elem[0]
            b = elem[1]
            c = elem[2]
            if a == method and b == hname and c == path:
                return (True, elem)
        return False, list()

    def update(self, method, hname, path, date, data):
        """
        Cette fonction permet de mettre à jour le cache.
        Elle prend en paramètre la méthode, le nom de domaine de l'hôte à
        contacter, le chemin du fichier dans l'arborescence du serveur,
        l'instant auquel la requête a été effectuée et le résultat de la
        requête.
        Les champs date et data de l'entrée (method, hname, path) seront ainsi
        mis à jour.
        """
        print "Résultat de", method, hname + path, "mis à jour en cache. \n"
        for elem in self.pages:
            a = elem[0]
            b = elem[1]
            c = elem[2]
            if a == method and b == hname and c == path:
                elem[3] = date
                elem[4] = data
    
    def __str__(self):
        """
        Cette fonction retourne une représentation du cache sous
        forme de chaine de caractères.
        """

        i = 0
        result = ""
        for e in self.pages:
            result = result + str(i) + ") "
            result = result + e[0] + " " + e[1] + e[2] + " (" + e[3] + ")\n"
            i = i + 1
        return result
